package org.examat.web.controladores;

import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.Serializable;
import java.io.FileWriter;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.Resource;
//import javax.enterprise.context.*;

//import javax.inject.Named;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import javax.servlet.http.HttpServletRequest;
import org.examat.entidades.Pregunta;
import javax.transaction.UserTransaction;
import org.examat.entidades.*;
import org.examat.web.controladores.util.Sesiones;

import org.apache.commons.io.FilenameUtils;
import org.apache.myfaces.custom.fileupload.UploadedFile;

/**
 *
 * @author Fer
 */
//@Named
@ManagedBean(name="creaPreguntaController")
//@SessionScoped
@ViewScoped
public class CreaPreguntaController
    implements Serializable 
{
    @PersistenceContext
    private EntityManager em;
    private List<TipoExamen> tiposExamen;
    private List<Seccion> secciones;
    private Integer seccionIdActual;
    private List<Integer> tiposExamenActuales;
    private String enunciado;
    private String opcion1;
    private String opcion2;
    private String opcion3;
    private String opcion4;

    private UploadedFile upFileOp1;
    private UploadedFile upFileOp2;
    private UploadedFile upFileOp3;
    private UploadedFile upFileOp4;
    private UploadedFile upFileEnun;
    private String vistaPrevia;
    
    public UploadedFile getUpFileEnun() { 
        return upFileEnun; 
    }
    
    public void setUpFileEnun(UploadedFile upFileEnun) {
        this.upFileEnun = upFileEnun;
    }

    public UploadedFile getUpFileOp1() {
        return upFileOp1;
    }

    public void setUpFileOp1(UploadedFile upFileOp1) {
        this.upFileOp1 = upFileOp1;
    }

    public UploadedFile getUpFileOp2() {
        return upFileOp2;
    }

    public void setUpFileOp2(UploadedFile upFileOp2) {
        this.upFileOp2 = upFileOp2;
    }

    public UploadedFile getUpFileOp3() {
        return upFileOp3;
    }

    public void setUpFileOp3(UploadedFile upFileOp3) {
        this.upFileOp3 = upFileOp3;
    }

    public UploadedFile getUpFileOp4() {
        return upFileOp4;
    }

    public void setUpFileOp4(UploadedFile upFileOp4) {
        this.upFileOp4 = upFileOp4;
    }
    
    @Resource private UserTransaction utx;

    public String getOpcion1() {
        return this.opcion1;
    }

    public String getVistaPrevia() {
        return vistaPrevia;
    }
    public void creaVistaPrevia() 
    {
        vistaPrevia = "<p> Enunciado: </p>"+enunciado;
        vistaPrevia = vistaPrevia +"<p>Opción 1: </p> "+opcion1;
        vistaPrevia = vistaPrevia +"<p>Opción 2: </p>"+opcion2;
        vistaPrevia = vistaPrevia +"<p>Opción 3: </p>"+opcion3;
        vistaPrevia = vistaPrevia +"<p>Opción 4: </p>"+opcion4;   
    }

    public void setVistaPrevia(String vistaPrevia) 
    {
        this.vistaPrevia = vistaPrevia;
    }
    
    public void guardaImagen()
    {
        String fileName = FilenameUtils.getName(upFileEnun.getName());
        String contentType = upFileEnun.getContentType();
        BufferedOutputStream output = null;
        try {
            byte[] bb = this.upFileEnun.getBytes();
            FileOutputStream fos =  new FileOutputStream("cosa");
            output = new BufferedOutputStream(fos);
            output.write(bb);
            output.close();
        } catch (IOException ex) {
            Logger.getLogger(CreaPreguntaController.class.getName()).log(Level.SEVERE, null, ex);
            System.err.println("Error al guardar el archivo");
        }        
    }
    

    public void guardaPregunta() 
    {
        Pregunta nueva = new Pregunta();
        nueva.setOpcion1(opcion1);
        nueva.setOpcion2(opcion2);
        nueva.setOpcion3(opcion3);
        nueva.setOpcion4(opcion4);
        nueva.setEnunciado(enunciado);
        //nueva.setId(1);
        nueva.setNumVecesElegida(0);

        //nueva.setClaveUnicaProfesor((Integer) Sesiones.get("user_claveunica"));
        nueva.setClaveUnicaProfesor(new Integer(2));
        nueva.setDificultad(new Integer(1));

        PreguntaEsDeTipoExamenPK pregPK;
        boolean committed=false;
        //nueva.setIdSeccion(seccionIdActual);
        try {
            //UserTransaction ut = (UserTransaction) new InitialContext().lookup("UserTransaction");
            utx.begin();
            //System.out.println(utx.toString());
            em.joinTransaction();
            em.persist(nueva);
            
            //em.flush();
            //for (Integer tipoExamen : tiposExamenActuales) {
                //pregPK = new PreguntaEsDeTipoExamenPK(1,tipoExamen);
                //em.persist(new PreguntaEsDeTipoExamen(pregPK));
            //}
            //em.flush();
            utx.commit();
            
            committed = true;
            //System.out.println("Llegue" +nueva.getId());
        }catch(Exception ex){
            System.out.println("No llegue");
            System.out.println(ex.getMessage());
            ex.printStackTrace();
        }
        finally{
            try{
                if(!committed) utx.rollback();
            }catch(Exception ex){
            }
        }
    }

    public String getOpcion2() {
        return this.opcion2;
    }

    public String getOpcion3() {
        return this.opcion3;
    }

    public String getOpcion4() {
        return this.opcion4;
    }

    public void setOpcion1(String opcion1) {
        this.opcion1 = opcion1;
    }

    public void setOpcion2(String opcion2) {
        this.opcion2 = opcion2;
    }

    public void setOpcion3(String opcion3) {
        this.opcion3 = opcion3;
    }

    public void setOpcion4(String opcion4) {
        this.opcion4 = opcion4;
    }

    /**
     * Get the value of enunciado
     *
     * @return the value of enunciado
     */
    public String getEnunciado() {
        return enunciado;
    }

    /**
     * Set the value of enunciado
     *
     * @param enunciado new value of enunciado
     */
    public void setEnunciado(String enunciado) {
        this.enunciado = enunciado;
    }

    /**
     * Get the value of tiposExamenActuales
     *
     * @return the value of tiposExamenActuales
     */
    public List<Integer> getTiposExamenActuales() {
        return tiposExamenActuales;
    }

    /**
     * Set the value of tiposExamenActuales
     *
     * @param tiposExamenActuales new value of tiposExamenActuales
     */
    public void setTiposExamenActuales(List<Integer> tiposExamenActuales) {
        this.tiposExamenActuales = tiposExamenActuales;
    }

    /**
     * Get the value of seccionIdActual
     *
     * @return the value of seccionIdActual
     */
    public Integer getSeccionIdActual() {
        return seccionIdActual;
    }

    /**
     * Set the value of seccionIdActual
     *
     * @param seccionIdActual new value of seccionIdActual
     */
    public void setSeccionIdActual(Integer seccionIdActual) {
        this.seccionIdActual = seccionIdActual;
    }

    /**
     * Get the value of secciones
     *
     * @return the value of secciones
     */
    public List<Seccion> getSecciones() {
        Query q;
        q = em.createNamedQuery("Seccion.findAll");
        this.secciones = q.getResultList();
        return secciones;
    }

    /**
     * Get the value of tiposExamen
     *
     * @return the value of tiposExamen
     */
    public List<TipoExamen> getTiposExamen() {
        Query q;
        q = em.createNamedQuery("TipoExamen.findAll");
        this.tiposExamen = q.getResultList();
        return this.tiposExamen;
    }
    

    public boolean getLoginValido() {
        return Sesiones.checkLogin();
    }
}
